package services

import (
	"errors"
	"github.com/gin-gonic/gin"
	"log"
	"math/rand"
	"mime/multipart"
	"os"
	"path"
	"sort"
	"strconv"
	"time"
)

func UploadImage(file *multipart.FileHeader, c *gin.Context) (string, error) {
	if file.Size > 1024*1024*5 {
		return "", errors.New("图片大小不能超过5M")
	}

	limitTypes := []string{"image/jpeg", "image/png"}
	fileType := file.Header["Content-Type"][0]
	typeInIndex := sort.SearchStrings(limitTypes, fileType)
	// 判断类型，gif不知道为什么会无法再sortStrings中搜索到，故拎出来单独判断
	if (typeInIndex >= len(limitTypes) || limitTypes[typeInIndex] != fileType) && fileType != "image/gif" {
		return "", errors.New("文件类型限制为png、jpg、gif")
	}

	// 存放文件不存在则创建目录
	savePath := "./static/upload/image/"
	_, err := os.Stat(savePath)
	if os.IsNotExist(err) {
		creErr := os.MkdirAll(savePath, 777)
		if creErr != nil {
			log.Println("创建目录失败")
			return "", errors.New("创建目录失败")
		}
	}

	//获取后缀名
	extName := path.Ext(file.Filename)
	// 设置保存的文件名称：时间戳+10000以内的随机数+后缀名
	saveFileName := strconv.FormatInt(time.Now().Unix(), 10) + strconv.Itoa(rand.Intn(10000)) + extName

	dst := path.Join(savePath, saveFileName)
	// 上传文件到指定的路径
	saveErr := c.SaveUploadedFile(file, dst)
	log.Println(saveErr)
	if saveErr != nil {
		log.Println("保存失败")
		return "", saveErr
	}

	return savePath + saveFileName, nil
}
